home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / gnu / gnpltsrc.lha / plot.h < prev    next >
C/C++ Source or Header  |  1996-01-22  |  25KB  |  896 lines

  1. /*
  2.  * $Id: plot.h,v 1.92 1995/12/02 22:04:36 drd Exp $
  3.  *
  4.  */
  5.  
  6. /* GNUPLOT - plot.h */
  7. /*
  8.  * Copyright (C) 1986 - 1993   Thomas Williams, Colin Kelley
  9.  *
  10.  * Permission to use, copy, and distribute this software and its
  11.  * documentation for any purpose with or without fee is hereby granted, 
  12.  * provided that the above copyright notice appear in all copies and 
  13.  * that both that copyright notice and this permission notice appear 
  14.  * in supporting documentation.
  15.  *
  16.  * Permission to modify the software is granted, but not the right to
  17.  * distribute the modified code.  Modifications are to be distributed 
  18.  * as patches to released version.
  19.  *  
  20.  * This software is provided "as is" without express or implied warranty.
  21.  * 
  22.  *
  23.  * AUTHORS
  24.  * 
  25.  *   Original Software:
  26.  *     Thomas Williams,  Colin Kelley.
  27.  * 
  28.  *   Gnuplot 2.0 additions:
  29.  *       Russell Lang, Dave Kotz, John Campbell.
  30.  *
  31.  *   Gnuplot 3.0 additions:
  32.  *       Gershon Elber and many others.
  33.  * 
  34.  * There is a mailing list for gnuplot users. Note, however, that the
  35.  * newsgroup 
  36.  *    comp.graphics.gnuplot 
  37.  * is identical to the mailing list (they
  38.  * both carry the same set of messages). We prefer that you read the
  39.  * messages through that newsgroup, to subscribing to the mailing list.
  40.  * (If you can read that newsgroup, and are already on the mailing list,
  41.  * please send a message info-gnuplot-request@dartmouth.edu, asking to be
  42.  * removed from the mailing list.)
  43.  *
  44.  * The address for mailing to list members is
  45.  *       info-gnuplot@dartmouth.edu
  46.  * and for mailing administrative requests is 
  47.  *       info-gnuplot-request@dartmouth.edu
  48.  * The mailing list for bug reports is 
  49.  *       bug-gnuplot@dartmouth.edu
  50.  * The list of those interested in beta-test versions is
  51.  *       info-gnuplot-beta@dartmouth.edu
  52.  */
  53.  
  54. #ifndef PLOT_H        /* avoid multiple includes */
  55. #define PLOT_H
  56.  
  57. #include "ansichek.h"
  58.  
  59. /* #define NDEBUG */
  60. #include <assert.h>
  61.  
  62. #define PROGRAM "G N U P L O T"
  63. #define PROMPT "gnuplot> "
  64. #if defined(AMIGA_SC_6_1) || defined(AMIGA_AC_5)
  65. #define SHELL "NewShell"
  66. #else /* AMIGA */
  67. #ifdef ATARI
  68. #define SHELL "gulam.prg"
  69. #else /* ATARI */
  70. #ifdef OS2
  71. #define SHELL "c:\\cmd.exe"
  72. #else /* OS2 */
  73. #ifdef OSK
  74. #define SHELL "/dd/cmds/shell"
  75. #else /* OSK */
  76. #define SHELL "/bin/sh"        /* used if SHELL env variable not set */
  77. #endif /* OSK */
  78. #endif /* OS2 */
  79. #endif /* ATARI */
  80. #endif /* AMIGA  */
  81.  
  82. #if defined(__unix__) && !defined(unix)
  83. #define unix
  84. #endif
  85.  
  86. #define SAMPLES 100        /* default number of samples for a plot */
  87. #define ISO_SAMPLES 10        /* default number of isolines per splot */
  88. #define ZERO    1e-8        /* default for 'zero' set option */
  89.  
  90. #ifndef TERM
  91. /* default terminal is "unknown"; but see init_terminal */
  92. #define TERM "unknown"
  93. #endif
  94.  
  95. #define TRUE 1
  96. #define DTRUE 3 /* double true, used in autoscale: 1=autoscale ?min, 2=autoscale ?max */
  97. #define FALSE 0
  98.  
  99.  
  100. #define Pi 3.141592653589793
  101. #define DEG2RAD (Pi / 180.0)
  102.  
  103.  
  104. #define MIN_CRV_POINTS 100        /* minimum size of points[] in curve_points */
  105. #define MIN_SRF_POINTS 1000        /* minimum size of points[] in surface_points */
  106.  
  107.  
  108. /* note that MAX_LINE_LEN, MAX_TOKENS and MAX_AT_LEN do no longer limit the
  109.    size of the input. The values describe the steps in which the sizes are
  110.    extended. */
  111.  
  112. #define MAX_LINE_LEN 1024    /* maximum number of chars allowed on line */
  113. #define MAX_TOKENS 400
  114. #define MAX_ID_LEN 50        /* max length of an identifier */
  115.  
  116.  
  117. #define MAX_AT_LEN 150        /* max number of entries in action table */
  118. #define STACK_DEPTH 100
  119. #define NO_CARET (-1)
  120.  
  121. #ifdef MSDOS
  122. #define MAX_NUM_VAR    3    /* Ploting projection of func. of max. five vars. */
  123. #else
  124. #define MAX_NUM_VAR    5    /* Ploting projection of func. of max. five vars. */
  125. #endif
  126.  
  127. #define MAP3D_CARTESIAN        0    /* 3D Data mapping. */
  128. #define MAP3D_SPHERICAL        1
  129. #define MAP3D_CYLINDRICAL    2
  130.  
  131. #define CONTOUR_NONE    0    /* Where to place contour maps if at all. */
  132. #define CONTOUR_BASE    1
  133. #define CONTOUR_SRF    2
  134. #define CONTOUR_BOTH    3
  135.  
  136. #define CONTOUR_KIND_LINEAR    0
  137. #define CONTOUR_KIND_CUBIC_SPL    1
  138. #define CONTOUR_KIND_BSPLINE    2
  139.  
  140. #define LEVELS_AUTO        0        /* How contour levels are set */
  141. #define LEVELS_INCREMENTAL    1        /* user specified start & incremnet */
  142. #define LEVELS_DISCRETE        2        /* user specified discrete levels */
  143. #define MAX_DISCRETE_LEVELS   30
  144.  
  145. #define ANGLES_RADIANS    0
  146. #define ANGLES_DEGREES    1
  147.  
  148. #define NO_TICS        0
  149. #define TICS_ON_BORDER 1
  150. #define TICS_ON_AXIS   2
  151. #define TICS_MASK      3
  152. #define TICS_MIRROR    4
  153.  
  154. /* give some names to some array elements used in command.c and grap*.c
  155.  * maybe one day the relevant items in setshow will also be stored
  156.  * in arrays
  157.  */
  158.  
  159. /* SECOND_X_AXIS = FIRST_X_AXIS + SECOND_AXES
  160.  * FIRST_X_AXIS & SECOND_AXES == 0
  161.  */
  162. #define FIRST_AXES 0
  163. #define SECOND_AXES 4
  164.  
  165. #define FIRST_Z_AXIS 0
  166. #define FIRST_Y_AXIS 1
  167. #define FIRST_X_AXIS 2
  168. #define SECOND_Z_AXIS 4 /* for future expansion ;-) */
  169. #define SECOND_Y_AXIS 5
  170. #define SECOND_X_AXIS 6
  171. /* extend list for datatype[] for t,u,v,r though IMHO
  172.  * they are not relevant to time data [being parametric dummies]
  173.  */
  174. #define T_AXIS 3  /* fill gap */
  175. #define R_AXIS 7  /* never used ? */
  176. #define U_AXIS 8
  177. #define V_AXIS 9
  178.  
  179. #define AXIS_ARRAY_SIZE 10
  180. #define DATATYPE_ARRAY_SIZE 10
  181.  
  182. /* values for range_flags[] */
  183. #define RANGE_WRITEBACK 1    /* write auto-ed ranges back to variables for autoscale */
  184. #define RANGE_REVERSE   2    /* allow auto and reversed ranges */
  185.  
  186. /* we want two auto modes for minitics - default where minitics
  187.  * are auto for log/time and off for linear, and auto where
  188.  * auto for all graphs
  189.  * I've done them in this order so that logscale-mode can simply
  190.  * test bit 0 to see if it must do the minitics automatically.
  191.  * similarly, conventional plot can test bit 1 to see if minitics are
  192.  * required
  193.  */
  194. #define MINI_OFF      0
  195. #define MINI_DEFAULT  1
  196. #define MINI_AUTO     3
  197. #define MINI_USER     2
  198.  
  199.  
  200. /* Need to allow user to choose grid at first and/or second axes tics.
  201.  * Also want to let user choose circles at x or y tics for polar grid.
  202.  * Also want to allow user rectangular grid for polar plot or polar
  203.  * grid for parametric plot. So just go for full configurability.
  204.  * These are bitmasks
  205.  */
  206. #define GRID_OFF    0
  207. #define GRID_X      1
  208. #define GRID_Y      2
  209. #define GRID_Z      4
  210. #define GRID_X2     8
  211. #define GRID_Y2     16
  212. #define GRID_MX     32
  213. #define GRID_MY     64
  214. #define GRID_MZ     128
  215. #define GRID_MX2    256
  216. #define GRID_MY2    512
  217.  
  218. #if defined(AMIGA_SC_6_1) || defined(AMIGA_AC_5)
  219. #define OS "Amiga "
  220. #endif
  221.  
  222. #ifdef OS2
  223. #ifdef unix
  224. #undef unix    /* GCC might declare this */
  225. #define OS "OS/2"
  226. #endif
  227. #endif  /* OS2 */
  228.  
  229. #ifdef OSK
  230. #define OS "OS-9 "
  231. #endif  /* OSK */
  232.  
  233. #ifdef vms
  234. #define OS "VMS "
  235. #if !defined(VAXCRTL) && !defined(DECCRTL)
  236. #error Please /define either VAXCRTL or DECCRTL
  237. #endif
  238. #endif
  239.  
  240. #ifdef linux
  241. #define OS "Linux "
  242. #else
  243. #ifdef unix
  244. #define OS "unix "
  245. #endif
  246. #endif
  247.  
  248. #ifdef _WINDOWS
  249. #define _Windows
  250. #endif
  251.  
  252. #ifdef DOS386
  253. #define OS "DOS 386 "
  254. #endif
  255. #ifdef _Windows
  256. #ifdef WIN32
  257. #define OS "MS-Windows 32 bit "
  258. #else
  259. #define OS "MS-Windows "
  260. #endif
  261. #else
  262. #ifdef MSDOS
  263.  
  264. #ifdef MTOS
  265. #define OS "TOS & MiNT & MULTITOS & Magic - "
  266. #endif
  267. #ifdef unix    /* __EMX__ and DJGPP may set this */
  268. #undef OS
  269. #undef unix
  270. #endif
  271. #define OS "MS-DOS "
  272. #endif
  273. #endif
  274.  
  275.  
  276. #ifdef ATARI
  277. #define OS "TOS "
  278. #endif
  279.  
  280. #ifndef OS
  281. #define OS ""
  282. #endif
  283.  
  284.  
  285. /* To access curves larger than 64k, MSDOS needs to use huge pointers */
  286. #if (defined(__TURBOC__) && defined(MSDOS)) || (defined(_Windows) && !defined(WIN32))
  287. #define GPHUGE huge
  288. #define GPFAR far
  289. #else
  290. #define GPHUGE
  291. #define GPFAR
  292. #endif
  293.  
  294. /* introduce by Pedro Mendes, prm@aber.ac.uk */
  295. #ifdef WIN32
  296. #define far 
  297. #endif
  298.  
  299. /* get prototypes for str??? functions. this is so much better that clogging
  300.    up all files with loads of #ifdefs for incompatible return types */
  301. #include "stdfn.h"
  302.  
  303. /*
  304.  * Note about VERYLARGE:  This is the upper bound double (or float, if PC)
  305.  * numbers. This flag indicates very large numbers. It doesn't have to 
  306.  * be the absolutely biggest number on the machine.  
  307.  * If your machine doesn't have HUGE, or float.h,
  308.  * define VERYLARGE here. 
  309.  *
  310.  * example:
  311. #define VERYLARGE 1e37
  312.  *
  313.  * mgr@asgard.bo.open.de - Lars Hanke:
  314.  *   I tried to clean up this annoying, unreadable construct that gathered
  315.  *   there. By now it is identical in operation but a single line (see next
  316.  *   comment). The aim is to reduce or even eliminate #if's by finding the
  317.  *   minimum product.
  318.  *      -  Check your definition of HUGE. If it matches, place it into the
  319.  *         default.
  320.  *      -  If your machine does not have HUGE, define it. At best in an
  321.  *         #ifndef HUGE directive and let it pass through the default finally
  322.  *      -  If you don't have to include files other compilers have to include
  323.  *         but might do without blowing up your code, include those files
  324.  *      -  As far as I know ANSI the settings for AMIGA_SC_6_1 should run on any
  325.  *         platform. Try them!
  326.  */
  327.  
  328. /* float.h is included by any compiler except ATARI and Manx
  329.  * If it doesn't produce any bad, try including it to get rid of those lines
  330.  * ATTENTION: this line is NOT IDENTICAL in operation to the old code. The
  331.  *            old code's DEFAULT DID NOT INCLUDE <float.h>, while this code's
  332.  *            default does. If you run into trouble, add your system to the
  333.  *            exclusion list.
  334.  * NOTE:      this is the ONLY line, which is not identical in operation to
  335.  *            the old code. As <float.h> is ANSI this should not cause any
  336.  *            problem at all.
  337.  */
  338.  
  339. #if !defined(ATARI) && !defined(MTOS) && !defined(AMIGA_AC_5)
  340. #  include <float.h>
  341. #endif
  342.  
  343. /* ATARI and SAS/C 6.x need prototypes
  344.  * As this is ANSI standard, you should try to add your compiler to the
  345.  * list so that in the end, the conditionals might fall.
  346.  */
  347.  
  348. #if defined(ATARI) || defined(MTOS) || defined(AMIGA_SC_6_1)
  349. # include <stdio.h>
  350. # include <stdlib.h>
  351. # include <string.h>
  352. # include <math.h>
  353. #endif
  354.  
  355. /* Manx wants math.h only. Try to add it to the above list to get rid
  356.  * of those lines
  357.  */
  358.  
  359. #ifdef AMIGA_AC_5
  360. # include <math.h>
  361. #endif
  362.  
  363. /* There is a bug in the NEXT OS. This is a workaround. Lookout for
  364.  * an OS correction to cancel the following dinosaur
  365.  */
  366.  
  367. #if defined ( NEXT )
  368. #   if defined ( DBL_MAX)
  369. #      undef DBL_MAX
  370. #   endif
  371. #   define DBL_MAX 1.7976931348623157e+308
  372. #   undef HUGE
  373. #   define HUGE    DBL_MAX
  374. #   undef HUGE_VAL
  375. #   define HUGE_VAL DBL_MAX
  376. #endif
  377.  
  378. #ifndef HUGE              /* This seems to be missing */
  379. #  define HUGE DBL_MAX
  380. #endif
  381.  
  382. /* Now define VERYLARGE. This is usually DBL_MAX/2 - 1. On MS-DOS however
  383.  * we use floats for memory considerations and thus use FLT_MAX. The ATARI
  384.  * definition seems to be incorrect, so please check it, if you're familiar
  385.  * with ATARIs.
  386.  * I think we might use HUGE as the basic reference for VERYLARGE, but I'm
  387.  * not sure because I don't know all those systems. So whenever you reach
  388.  * the same code by adding your system to the following list - DO IT - and
  389.  * maybe we can get rid of those goddamned conditionals one day.
  390.  */
  391.  
  392. /* first the DBL_MAX systems. Check your DBL_MAX definition and simply
  393.  * erase your system from the list, if DBL_MAX is equal to HUGE
  394.  */
  395.  
  396. #if defined( vms ) || defined( _CRAY ) || defined(__osf__) || defined( OS2 ) || defined(__EMX__) || defined( DOS386) || defined(KSR) || defined(sgi)
  397. #  define VERYLARGE (DBL_MAX / 2 - 1)
  398. #else
  399.  
  400. /* Now the exotic systems MS-DOS, Windows and ATARI. Check your definition
  401.  * of HUGE and erase your system from the list, if it is identical to the one
  402.  * given below. ATARI users should check the validity of the overall definition.
  403.  * not sure about linux, I had one patch that defined VERLARGE as 1e38
  404.  */
  405.  
  406. #  if defined( MSDOS ) || defined( _Windows ) || defined( ATARI ) || defined( MTOS ) || defined(LINUX)
  407. #     if defined ATARI || defined MTOS
  408. #        define VERYLARGE HUGE_VAL
  409. #     else
  410. #        define VERYLARGE (FLT_MAX/2 - 1)      /* PCs */
  411. #     endif
  412. #  else
  413.  
  414. /* The default that applies to a lot of the originally named machines and
  415.  * to even more unnamed machines. If your system is listed above, try to
  416.  * fit your machine to this default.
  417.  */
  418.  
  419. #     define VERYLARGE (HUGE / 2 - 1)
  420. #  endif
  421. #endif
  422.  
  423. #define END_OF_COMMAND (c_token >= num_tokens || equals(c_token,";"))
  424. #define is_EOF(c) ((c) == 'e' || (c) == 'E')
  425.  
  426. #ifdef vms
  427.  
  428.  
  429. #define is_comment(c) ((c) == '#' || (c) == '!')
  430. #define is_system(c) ((c) == '$')
  431.  
  432.  
  433. #else /* vms */
  434.  
  435. #define is_comment(c) ((c) == '#')
  436. #define is_system(c) ((c) == '!')
  437.  
  438. #endif /* vms */
  439.  
  440. /* 
  441.  * memcpy() and memset() come by many names. The default is now to assume
  442.  * these functions as defined by ANSI.
  443.  * Define BCOPY to use bcopy(), BZERO to use bzero()
  444.  *  NOCOPY to use a handwritten version in parse.c
  445.  */
  446.  
  447. #if defined(BCOPY)
  448. #  define memcpy(dest,src,len) bcopy(src,dest,len)
  449. #else 
  450. # ifdef NOCOPY
  451.     /* use the handwritten memcpy in parse.c */
  452. # else
  453.    /* use memcpy directly, define bcopy to cause an error */
  454. #  ifdef bcopy
  455. #   undef bcopy
  456. #  endif
  457. #  define bcopy(s,d,l) bcopy->dont
  458. # endif /* NOCOPY */
  459. #endif /* BCOPY */
  460.  
  461. /*
  462.  * Since we want to use memset, we have to map a possibly nonzero fill byte
  463.  * to the bzero function. The following defined might seem a bit odd, but I
  464.  * think this is the only possible way.
  465.  */
  466.  
  467. #if defined(BZERO)
  468. #include <assert.h>
  469. #define memset(s, b, l)    \
  470. do {            \
  471.   assert((b)==0);    \
  472.   bzero(s, l);        \
  473. } while(0)
  474. #else
  475.   /* use memset, define bzero to cause an error */
  476. # ifdef bzero
  477. #  undef bzero
  478. # endif
  479. # define bzero(s,l) bzero->dont
  480. #endif
  481.  
  482. /* if NOGAMMA is defined, gamma will be defined in specfun.c */
  483.  
  484. #if defined(NOGAMMA) || defined(MSDOS)
  485. # undef GAMMA
  486. #else
  487. # ifndef GAMMA
  488. #  define GAMMA gamma
  489. # endif /* GAMMA */
  490. #endif /* NOGAMMA ||MSDOS */
  491.  
  492. #define top_of_stack stack[s_p]
  493.  
  494. #ifndef RETSIGTYPE
  495. /* assume ANSI definition by default */
  496. #define RETSIGTYPE void
  497. #endif
  498.  
  499. #ifndef SIGFUNC_NO_INT_ARG
  500. typedef RETSIGTYPE (*sigfunc)__P((int));
  501. #else
  502. typedef RETSIGTYPE (*sigfunc)__P((void));
  503. #endif
  504.  
  505. #ifndef SORTFUNC_ARGS
  506. typedef int (*sortfunc) __P((const generic *, const generic *));
  507. #else
  508. typedef int (*sortfunc) __P((SORTFUNC_ARGS, SORTFUNC_ARGS));
  509. #endif
  510.  
  511. typedef int TBOOLEAN;
  512.  
  513. #ifdef __ZTC__
  514. typedef int (*FUNC_PTR)(...);
  515. #else
  516. #ifdef AMIGA_SC_6_1
  517. typedef int (*FUNC_PTR)(union argument *arg);
  518. #else
  519. typedef int (*FUNC_PTR)();
  520. #endif
  521. #endif
  522.  
  523. enum operators {
  524.     /* keep this in line with table in plot.c */
  525.     PUSH, PUSHC, PUSHD1, PUSHD2, PUSHD, CALL, CALLN, LNOT, BNOT, UMINUS,
  526.     LOR, LAND, BOR, XOR, BAND, EQ, NE, GT, LT, GE, LE, PLUS, MINUS, MULT,
  527.     DIV, MOD, POWER, FACTORIAL, BOOLE,
  528.     DOLLARS, /* for using extension - div */
  529.     /* only jump operators go between jump and sf_start */
  530.    JUMP, JUMPZ, JUMPNZ, JTERN, SF_START
  531. };
  532.  
  533.  
  534. #define is_jump(operator) ((operator) >=(int)JUMP && (operator) <(int)SF_START)
  535.  
  536.  
  537. enum DATA_TYPES {
  538.     INTGR, CMPLX
  539. };
  540.  
  541. #define TIME 3
  542.  
  543. enum PLOT_TYPE {
  544.     FUNC, DATA, FUNC3D, DATA3D
  545. };
  546.  
  547. /*XXX - JG */
  548. enum PLOT_STYLE {
  549.         LINES, POINTSTYLE, IMPULSES, LINESPOINTS, DOTS, XERRORBARS, YERRORBARS,
  550.         XYERRORBARS, BOXXYERROR, BOXES, BOXERROR, STEPS, FSTEPS, VECTOR
  551. };
  552. enum PLOT_SMOOTH { 
  553.     NONE, UNIQUE, CSPLINES, ACSPLINES, BEZIER, SBEZIER
  554.  
  555. };
  556.  
  557. /* this order means we can use  x-(just*strlen(text)*t->h_char)/2 if term cannot just */
  558. enum JUSTIFY {
  559.     LEFT, CENTRE, RIGHT
  560. };
  561.  
  562. /* we use a similar trick for vertical justification of multi-line labels */
  563. #define JUST_TOP    0
  564. #define JUST_CENTRE 1
  565. #define JUST_BOT    2
  566.  
  567. #if !(defined(ATARI)&&defined(__GNUC__)&&defined(_MATH_H)) &&  !(defined(MTOS)&&defined(__GNUC__)&&defined(_MATH_H)) /* FF's math.h has the type already */
  568. struct cmplx {
  569.     double real, imag;
  570. };
  571. #endif
  572.  
  573.  
  574. struct value {
  575.     enum DATA_TYPES type;
  576.     union {
  577.         int int_val;
  578.         struct cmplx cmplx_val;
  579.     } v;
  580. };
  581.  
  582.  
  583. struct lexical_unit {    /* produced by scanner */
  584.     TBOOLEAN is_token;    /* true if token, false if a value */ 
  585.     struct value l_val;
  586.     int start_index;    /* index of first char in token */
  587.     int length;            /* length of token in chars */
  588. };
  589.  
  590.  
  591. struct ft_entry {        /* standard/internal function table entry */
  592.     char *f_name;        /* pointer to name of this function */
  593.     FUNC_PTR func;        /* address of function to call */
  594. };
  595.  
  596.  
  597. struct udft_entry {                /* user-defined function table entry */
  598.     struct udft_entry *next_udf;         /* pointer to next udf in linked list */
  599.     char udf_name[MAX_ID_LEN+1];         /* name of this function entry */
  600.     struct at_type *at;            /* pointer to action table to execute */
  601.     char *definition;             /* definition of function as typed */
  602.     struct value dummy_values[MAX_NUM_VAR];    /* current value of dummy variables */
  603. };
  604.  
  605.  
  606. struct udvt_entry {            /* user-defined value table entry */
  607.     struct udvt_entry *next_udv; /* pointer to next value in linked list */
  608.     char udv_name[MAX_ID_LEN+1]; /* name of this value entry */
  609.     TBOOLEAN udv_undef;        /* true if not defined yet */
  610.     struct value udv_value;    /* value it has */
  611. };
  612.  
  613.  
  614. union argument {            /* p-code argument */
  615.     int j_arg;                /* offset for jump */
  616.     struct value v_arg;        /* constant value */
  617.     struct udvt_entry *udv_arg;    /* pointer to dummy variable */
  618.     struct udft_entry *udf_arg; /* pointer to udf to execute */
  619. };
  620.  
  621.  
  622. struct at_entry {            /* action table entry */
  623.     enum operators index;    /* index of p-code function */
  624.     union argument arg;
  625. };
  626.  
  627.  
  628. struct at_type {
  629.     int a_count;                /* count of entries in .actions[] */
  630.     struct at_entry actions[MAX_AT_LEN];
  631.         /* will usually be less than MAX_AT_LEN is malloc()'d copy */
  632. };
  633.  
  634.  
  635. /* Defines the type of a coordinate */
  636. /* INRANGE and OUTRANGE points have an x,y point associated with them */
  637. enum coord_type {
  638.     INRANGE,                /* inside plot boundary */
  639.     OUTRANGE,                /* outside plot boundary, but defined */
  640.     UNDEFINED                /* not defined at all */
  641. };
  642.  
  643. #if defined(MSDOS) || defined(_Windows) 
  644. typedef float coordval;        /* memory is tight on PCs! */
  645. #else
  646. typedef double coordval;
  647. #endif
  648.  
  649. struct coordinate {
  650.     enum coord_type type;    /* see above */
  651.     coordval x, y, z;
  652.     coordval ylow, yhigh;    /* ignored in 3d */
  653.         coordval xlow, xhigh;   /* also ignored in 3d */
  654. #if (defined(_Windows) && !defined(WIN32)) || (defined(MSDOS) && defined(__TURBOC__))
  655.     char pad[2];        /* pad to 32 byte boundary */
  656. #endif
  657. };
  658.  
  659. struct curve_points {
  660.     struct curve_points *next_cp;    /* pointer to next plot in linked list */
  661.     int token;    /* last token in re/plot line, for second pass */
  662.     enum PLOT_TYPE plot_type;
  663.     enum PLOT_STYLE plot_style;
  664.     enum PLOT_SMOOTH plot_smooth;
  665.     char *title;
  666.     int line_type;
  667.     int point_type;
  668.      int p_max;                    /* how many points are allocated */
  669.     int p_count;                    /* count of points in points */
  670.     int x_axis;                    /* FIRST_X_AXIS or SECOND_X_AXIS */
  671.     int y_axis;                    /* FIRST_Y_AXIS or SECOND_Y_AXIS */
  672.     struct coordinate GPHUGE *points;
  673. };
  674.  
  675. struct gnuplot_contours {
  676.     struct gnuplot_contours *next;
  677.     struct coordinate GPHUGE *coords;
  678.      char isNewLevel;
  679.      char label[32];
  680.     int num_pts;
  681. };
  682.  
  683. struct iso_curve {
  684.     struct iso_curve *next;
  685.      int p_max;                    /* how many points are allocated */
  686.     int p_count;                    /* count of points in points */
  687.     struct coordinate GPHUGE *points;
  688. };
  689.  
  690. struct surface_points {
  691.     struct surface_points *next_sp;    /* pointer to next plot in linked list */
  692.     int token;  /* last token in re/plot line, for second pass */
  693.     enum PLOT_TYPE plot_type;
  694.     enum PLOT_STYLE plot_style;
  695.     char *title;
  696.     int line_type;
  697.     int point_type;
  698.     int has_grid_topology;
  699.     int num_iso_read;  /* Data files only - num of isolines read from file. */
  700.     /* for functions, num_iso_read is the number of 'primary' isolines (in x dirn) */
  701.     struct gnuplot_contours *contours;    /* Not NULL If have contours. */
  702.     struct iso_curve *iso_crvs;
  703. };
  704.  
  705. /* It should go without saying that additional entries may be made
  706.  * only at the end of this structure. Any fields added must be
  707.  * optional - a value of 0 (or NULL pointer) means an older driver
  708.  * does not support that feature - gnuplot must still be able to
  709.  * function without that terminal feature
  710.  */
  711.  
  712. /* values for the optional flags field - choose sensible defaults
  713.  * these aren't really very sensible names - multiplot attributes
  714.  * depend on whether stdout is redirected or not. Remember that
  715.  * the default is 0. Thus most drivers can do multiplot only if
  716.  * the output is redirected
  717.  */
  718.  
  719. #define TERM_CAN_MULTIPLOT    1  /* tested if stdout not redirected */
  720. #define TERM_CANNOT_MULTIPLOT 2  /* tested if stdout is redirected */
  721.  
  722. struct TERMENTRY {
  723.     char *name;
  724. #if defined(_Windows) && !defined(WIN32)
  725.     char GPFAR description[80];    /* to make text go in FAR segment */
  726. #else
  727.     char *description;
  728. #endif
  729.     unsigned int xmax,ymax,v_char,h_char,v_tic,h_tic;
  730.  
  731.     void (*options) __P((void));
  732.     void (*init) __P((void));
  733.     void (*reset) __P((void));
  734.     void (*text) __P((void));
  735.     int (*scale) __P((double, double));
  736.     void (*graphics) __P((void));
  737.     void (*move) __P((unsigned int, unsigned int));
  738.     void (*vector) __P((unsigned int, unsigned int));
  739.     void (*linetype) __P((int));
  740.     void (*put_text) __P((unsigned int, unsigned int,char*));
  741. /* the following are optional. set term ensures they are not NULL */
  742.     int (*text_angle) __P((int));
  743.     int (*justify_text) __P((enum JUSTIFY));
  744.     void (*point) __P((unsigned int, unsigned int,int));
  745.     void (*arrow) __P((unsigned int, unsigned int, unsigned int, unsigned int, int));
  746.     int (*set_font) __P((char *font));
  747.     void (*set_pointsize) __P((double)); /* notification of 'set pointsize' */
  748.     int flags;
  749.     void (*suspend) __P((void)); /* called after one plot of multiplot */
  750.     void (*resume)  __P((void)); /* called before plots of multiplot */
  751. };
  752.  
  753. #if defined(_Windows) && !defined(WIN32)
  754. #define termentry TERMENTRY far
  755. #else
  756. #define termentry TERMENTRY
  757. #endif
  758.  
  759.  
  760. /* we might specify a co-ordinate in first/second/graph/screen coords */
  761. /* allow x,y and z to be in separate co-ordinates ! */
  762. enum position_type { first_axes, second_axes, graph, screen };
  763.  
  764. struct position {
  765.     enum position_type scalex,scaley,scalez;
  766.     double x,y,z;
  767. };
  768.  
  769. struct text_label {
  770.     struct text_label *next;    /* pointer to next label in linked list */
  771.     int tag;            /* identifies the label */
  772.     struct position place;
  773.     enum JUSTIFY pos;
  774.     char text[MAX_LINE_LEN+1];
  775.         char font[MAX_LINE_LEN+1];
  776. }; /* Entry font added by DJL */
  777.  
  778. struct arrow_def {
  779.     struct arrow_def *next;    /* pointer to next arrow in linked list */
  780.     int tag;            /* identifies the arrow */
  781.     struct position start;
  782.     struct position end;
  783.     TBOOLEAN head;            /* arrow has a head or not */
  784.     int line;            /* which line-type ? */
  785. };
  786.  
  787. /* Tic-mark labelling definition; see set xtics */
  788. struct ticdef {
  789.     int type;                /* one of three values below */
  790. #define TIC_COMPUTED 1        /* default; gnuplot figures them */
  791. #define TIC_SERIES 2        /* user-defined series */
  792. #define TIC_USER 3            /* user-defined points */
  793. #define TIC_MONTH 4        /* print out month names ((mo-1[B)%12)+1 */
  794. #define TIC_DAY 5        /* print out day of week */
  795.     union {
  796.        struct {            /* for TIC_SERIES */
  797.           double start, incr;
  798.           double end;        /* ymax, if VERYLARGE */
  799.        } series;
  800.        struct ticmark *user;    /* for TIC_USER */
  801.     } def;
  802. };
  803.  
  804. /* Defines one ticmark for TIC_USER style.
  805.  * If label==NULL, the value is printed with the usual format string.
  806.  * else, it is used as the format string (note that it may be a constant
  807.  * string, like "high" or "low").
  808.  */
  809. struct ticmark {
  810.     double position;        /* where on axis is this */
  811.     char *label;            /* optional (format) string label */
  812.     struct ticmark *next;    /* linked list */
  813. };
  814.  
  815. /*
  816.  * SS$_NORMAL is "normal completion", STS$M_INHIB_MSG supresses
  817.  
  818.  * printing a status message.
  819.  * SS$_ABORT is the general abort status code.
  820.  from:    Martin Minow
  821.     decvax!minow
  822.  */
  823. #ifdef    vms
  824. #include        <ssdef.h>
  825. #include        <stsdef.h>
  826. #define    IO_SUCCESS    (SS$_NORMAL | STS$M_INHIB_MSG)
  827. #define    IO_ERROR    SS$_ABORT
  828. #endif /* vms */
  829.  
  830.  
  831. #ifndef    IO_SUCCESS    /* DECUS or VMS C will have defined these already */
  832. #define    IO_SUCCESS    0
  833. #endif
  834. #ifndef    IO_ERROR
  835. #define    IO_ERROR    1
  836. #endif
  837.  
  838. /* Some key global variables */
  839. extern TBOOLEAN screen_ok;        /* from util.c */
  840. extern TBOOLEAN term_init;        /* from term.c */
  841. extern struct termentry *term;/* from term.c */
  842. extern TBOOLEAN undefined;        /* from internal.c */
  843. extern char *input_line;        /* from command.c */
  844. extern int input_line_len;
  845. extern char *replot_line;
  846. extern struct lexical_unit *token;
  847. extern int token_table_size;
  848. extern int num_tokens, c_token;
  849. extern int inline_num;
  850. extern char c_dummy_var[MAX_NUM_VAR][MAX_ID_LEN+1];
  851. extern struct ft_entry GPFAR ft[];    /* from plot.c */
  852. extern struct udft_entry *first_udf;
  853. extern struct udvt_entry *first_udv;
  854. extern TBOOLEAN interactive;
  855. extern char *infile_name;
  856. extern struct udft_entry *dummy_func;
  857. #ifdef _Windows    /* can we use GPFAR here? */
  858. extern jmp_buf far env;
  859. #else
  860. extern jmp_buf env;
  861. #endif
  862. extern char dummy_var[MAX_NUM_VAR][MAX_ID_LEN+1];    /* from setshow.c */
  863.  
  864. /* Windows needs to redefine stdin/stdout functions */
  865. #ifdef _Windows
  866. #include "win/wtext.h"
  867. #endif
  868.  
  869. #define TTOP 0
  870. #define TBOTTOM 1
  871. #define TUNDER 2
  872. #define TLEFT 0
  873. #define TRIGHT 1
  874. #define TOUT 2
  875. #define JLEFT 0
  876. #define JRIGHT 1
  877.   
  878. /* defines used for timeseries, seconds */
  879. #define ZERO_YEAR    2000
  880. #define SEC_OFFS_SYS    946684800.0        /*  zero gnuplot (2000) - zero system (1970) */
  881. #define YEAR_SEC    31557600.0    /* avg, incl. leap year */
  882. #define MON_SEC        2629800.0    /* YEAR_SEC / 12 */
  883. #define WEEK_SEC    604800.0
  884. #define DAY_SEC        86400.0
  885.  
  886. /* returns from DF_READLINE in datafile.c */
  887. /* +ve is number of columns read */
  888. #define DF_EOF          (-1)
  889. #define DF_UNDEFINED    (-2)
  890. #define DF_FIRST_BLANK  (-3)
  891. #define DF_SECOND_BLANK (-4)
  892.  
  893. #include "protos.h"
  894.  
  895. #endif        /* PLOT_H */
  896.